/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package juegocartas.comparadores;

import java.util.List;
import juegocartas.clases.Carta;
import juegocartas.clases.JuegoMus;
import juegocartas.clases.Jugador;

/**
 *
 * @author JuanFran Jara Bellid
 */
public class ComparadorPares implements Comparador {

    public Jugador obtenerJugadorMejorMano(Jugador jugadorUno, Jugador jugadorDos) {

        // TODO: esto no debe pasar, son situaciones de error, usar assert
        if (jugadorUno == null && jugadorDos != null) {
            return jugadorDos;
        }
        if (jugadorDos == null && jugadorUno != null) {
            return jugadorUno;
        }
        if (jugadorDos == null && jugadorUno == null) {
            return null;
        }

        List<Carta> paresJugadorUno = JuegoMus.devolverPares(jugadorUno.getMano());
        List<Carta> paresJugadorDos = JuegoMus.devolverPares(jugadorDos.getMano());

        if (paresJugadorUno.size() > paresJugadorDos.size()) {
            return jugadorUno;
        } else if (paresJugadorUno.size() < paresJugadorDos.size()) {
            return jugadorDos;
        } else {
            paresJugadorUno = JuegoMus.ordenarCartasPares(paresJugadorUno);
            paresJugadorDos = JuegoMus.ordenarCartasPares(paresJugadorDos);
            Carta parJugadorUno = paresJugadorUno.get(0);
            Carta parJugadorDos = paresJugadorDos.get(0);
            if (JuegoMus.getValorCarta(parJugadorUno) > JuegoMus.getValorCarta(parJugadorDos)) {
                return jugadorUno;
            } else if (JuegoMus.getValorCarta(parJugadorUno) < JuegoMus.getValorCarta(parJugadorDos)) {
                return jugadorDos;
            } else {
                if (paresJugadorUno.size() == 3) {
                    return jugadorUno; //tienen la misma media, gana la mano
                } else if (paresJugadorUno.size() == 2 ){
                    return jugadorUno; //el mismo par, gana la mano
                } else {
                    Carta parDosJugadorUno = paresJugadorUno.get(2);
                    Carta parDosJugadorDos = paresJugadorDos.get(2);
                    if (JuegoMus.getValorCarta(parDosJugadorUno) > JuegoMus.getValorCarta(parDosJugadorDos)) {
                        return jugadorUno;
                    } else if (JuegoMus.getValorCarta(parDosJugadorUno) < JuegoMus.getValorCarta(parDosJugadorDos)) {
                        return jugadorDos;
                    } else {
                        return jugadorUno; //tienen el mismo duples, gana la mano
                    }
                }
            }
        }
    }

    public Jugador obtenerJugadorGanadorMano(List<Jugador> listaJugadores) {
        Jugador mejorJugador = null;
        for (int i = 0; i < listaJugadores.size(); i++) {
            if (i == 0) {
                Jugador jugadorUno = listaJugadores.get(0);
                Jugador jugadorDos = listaJugadores.get(1);
                mejorJugador = obtenerJugadorMejorMano(
                        JuegoMus.tenerParesSinLog(jugadorUno) ? jugadorUno : null,
                         JuegoMus.tenerParesSinLog(jugadorDos) ? jugadorDos : null);
                i = 1;
            } else {
                Jugador jugador = listaJugadores.get(i);
                if (JuegoMus.tenerParesSinLog(jugador)) {
                    mejorJugador = obtenerJugadorMejorMano(mejorJugador, jugador);
                }
            }
        }
        return mejorJugador;
    }

}
